package com.aizuda.boot.modules.common.constant.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 合同名称生成规则组件枚举
 * @Author sangyirong
 * @ClassName Component
 * @Version 1.0
 * @Date 2025/7/4 14:48
 */
@Getter
@AllArgsConstructor
public enum Component {

    /**
     * 自由文本 - 适用于所有规则类型
     */
    FREE_TEXT("FREE_TEXT", "自由文本", null, 
        Arrays.asList(NameRuleType.CONTRACT_APPLY, NameRuleType.SUPPLEMENT_AGREEMENT, NameRuleType.CONTRACT_TERMINATE)),
    
    /**
     * 连接符 - 适用于所有规则类型
     */
    CONNECTOR("CONNECTOR", "连接符", Arrays.asList("-", "/", ".", "_"),
        Arrays.asList(NameRuleType.CONTRACT_APPLY, NameRuleType.SUPPLEMENT_AGREEMENT, NameRuleType.CONTRACT_TERMINATE)),
    
    /**
     * 日期 - 适用于所有规则类型
     */
    DATE("DATE", "日期", Arrays.asList("yyyyMMdd", "yyyyMM", "yyyy"), 
        Arrays.asList(NameRuleType.CONTRACT_APPLY, NameRuleType.SUPPLEMENT_AGREEMENT, NameRuleType.CONTRACT_TERMINATE)),
    
    /**
     * 主合同文件名 - 仅适用于合同申请
     */
    MAIN_CONTRACT_FILE_NAME("MAIN_CONTRACT_FILE_NAME", "主合同文件名", null,
        Arrays.asList(NameRuleType.CONTRACT_APPLY)),
    
    /**
     * 主合同标题 - 仅适用于合同申请
     */
    MAIN_CONTRACT_TITLE("MAIN_CONTRACT_TITLE", "主合同标题", null, 
        Arrays.asList(NameRuleType.CONTRACT_APPLY)),
    
    /**
     * 补充协议文件名 - 仅适用于补充协议
     */
    SUPPLEMENT_AGREEMENT_FILE_NAME("SUPPLEMENT_AGREEMENT_FILE_NAME", "补充协议文件名", null, 
        Arrays.asList(NameRuleType.SUPPLEMENT_AGREEMENT)),
    
    /**
     * 补充协议标题 - 仅适用于补充协议
     */
    SUPPLEMENT_AGREEMENT_TITLE("SUPPLEMENT_AGREEMENT_TITLE", "补充协议标题", null, 
        Arrays.asList(NameRuleType.SUPPLEMENT_AGREEMENT)),
    
    /**
     * 终止协议文件名 - 仅适用于合同终止
     */
    TERMINATE_AGREEMENT_FILE_NAME("TERMINATE_AGREEMENT_FILE_NAME", "终止协议文件名", null, 
        Arrays.asList(NameRuleType.CONTRACT_TERMINATE)),
    
    /**
     * 终止协议标题 - 仅适用于合同终止
     */
    TERMINATE_AGREEMENT_TITLE("TERMINATE_AGREEMENT_TITLE", "终止协议标题", null, 
        Arrays.asList(NameRuleType.CONTRACT_TERMINATE)),
    
    /**
     * 原合同名称 - 适用于补充协议和合同终止
     */
    ORIGINAL_CONTRACT_NAME("ORIGINAL_CONTRACT_NAME", "原合同名称", null, 
        Arrays.asList(NameRuleType.SUPPLEMENT_AGREEMENT, NameRuleType.CONTRACT_TERMINATE)),
    
    /**
     * 合同类型缩写 - 适用于所有规则类型
     */
    CONTRACT_TYPE_ABBREVIATION("CONTRACT_TYPE_ABBREVIATION", "合同类型缩写", null, 
        Arrays.asList(NameRuleType.CONTRACT_APPLY, NameRuleType.SUPPLEMENT_AGREEMENT, NameRuleType.CONTRACT_TERMINATE)),
    
    /**
     * 收支类型全称 - 适用于所有规则类型
     */
    INCOME_EXPENSE_TYPE_FULL_NAME("INCOME_EXPENSE_TYPE_FULL_NAME", "收支类型全称", null, 
        Arrays.asList(NameRuleType.CONTRACT_APPLY, NameRuleType.SUPPLEMENT_AGREEMENT, NameRuleType.CONTRACT_TERMINATE)),
    
    /**
     * 合同经办人部门 - 适用于所有规则类型
     */
    CONTRACT_HANDLER_DEPARTMENT("CONTRACT_HANDLER_DEPARTMENT", "合同经办人部门", null, 
        Arrays.asList(NameRuleType.CONTRACT_APPLY, NameRuleType.SUPPLEMENT_AGREEMENT, NameRuleType.CONTRACT_TERMINATE)),

    /**
     * 我方全称 - 适用于所有规则类型
     */
    OUR_PARTY_FULL_NAME("OUR_PARTY_FULL_NAME", "我方全称", null,
        Arrays.asList(NameRuleType.CONTRACT_APPLY, NameRuleType.SUPPLEMENT_AGREEMENT, NameRuleType.CONTRACT_TERMINATE)),
    /**
     * 对方全称 - 适用于所有规则类型
     */
    COUNTERPARTY_FULL_NAME("COUNTERPARTY_FULL_NAME", "对方全称", null,
        Arrays.asList(NameRuleType.CONTRACT_APPLY, NameRuleType.SUPPLEMENT_AGREEMENT, NameRuleType.CONTRACT_TERMINATE)),
    /**
     * 我方简称 - 适用于所有规则类型
     */
    OUR_PARTY_SHORT_NAME("OUR_PARTY_SHORT_NAME", "我方简称", null,
        Arrays.asList(NameRuleType.CONTRACT_APPLY, NameRuleType.SUPPLEMENT_AGREEMENT, NameRuleType.CONTRACT_TERMINATE)),
    /**
     * 对方简称 - 适用于所有规则类型
     */
    COUNTERPARTY_SHORT_NAME("COUNTERPARTY_SHORT_NAME", "对方简称", null,
        Arrays.asList(NameRuleType.CONTRACT_APPLY, NameRuleType.SUPPLEMENT_AGREEMENT, NameRuleType.CONTRACT_TERMINATE)),
    /**
     * 合同字段 - 适用于所有规则类型
     */
    CONTRACT_FIELD("CONTRACT_FIELD", "合同字段", null, 
        Arrays.asList(NameRuleType.CONTRACT_APPLY, NameRuleType.SUPPLEMENT_AGREEMENT, NameRuleType.CONTRACT_TERMINATE));

    /**
     * 组件编码
     */
    private final String code;

    /**
     * 组件描述
     */
    private final String msg;

    /**
     * 组件可选值列表（如果为null表示自由输入）
     */
    private final List<String> values;

    /**
     * 适用的名称生成规则类型列表
     */
    private final List<NameRuleType> nameRuleTypes;

    /**
     * 根据规则类型获取适用的组件列表
     * @param ruleType 规则类型
     * @return 适用的组件列表
     */
    public static List<Component> getComponentsByRuleType(NameRuleType ruleType) {
        if (ruleType == null) {
            return Arrays.asList(values());
        }
        
        return Arrays.stream(values())
                .filter(component -> component.getNameRuleTypes().contains(ruleType))
                .collect(Collectors.toList());
    }

    /**
     * 获取所有通用组件（适用于所有规则类型的组件）
     * @return 通用组件列表
     */
    public static List<Component> getUniversalComponents() {
        return Arrays.stream(values())
                .filter(component -> component.getNameRuleTypes().size() == 3)
                .collect(Collectors.toList());
    }

    /**
     * 获取特定规则类型专用的组件
     * @param ruleType 规则类型
     * @return 专用组件列表
     */
    public static List<Component> getExclusiveComponents(NameRuleType ruleType) {
        if (ruleType == null) {
            return Arrays.asList();
        }
        
        return Arrays.stream(values())
                .filter(component -> component.getNameRuleTypes().size() == 1 
                    && component.getNameRuleTypes().contains(ruleType))
                .collect(Collectors.toList());
    }
}
